﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using _InformaticaIndustrial_DerivdosVinicos.DTO;
using Dao;

namespace _InformaticaIndustrial_DerivdosVinicos.Interfaz
{
    public partial class ModelosInv : Form
    {
        ModeloInventario inv;
        MateriaPrima mp;
        Componente comp;
        ProductoProcesoElaboracion ppe;

        public ModelosInv()
        {
            InitializeComponent();
            LoadCombo();
        }

        private void LoadCombo()
        {
            cbTipoArt.DataSource = new IPTipoMaestroArticulo().getAll<TipoMaestroArticulo>().Where(ta => ta.codTipo != "03").ToList();
            cbTipoArt.DisplayMember = "nombreTipo";
            cbTipoArt.ValueMember = "IdTP";

        }

        private void btGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                if (Convert.ToInt16(1) == Convert.ToInt16(cbTipoArt.SelectedValue)) //Es MP
                {
                    switch (inv.NombreModelo)
                    {
                        case "Lote Fijo":     
                            mp.IdModeloInventario = inv.Id;
                            mp.LoteOptimo = txtQ.Text;
                            mp.PuntoPedido = txtPP.Text;
                            mp.StockSeguridad = txtSS.Text;
                            break;
                        case "Intervalo Fijo":
                            mp.StockSeguridad = txtSS.Text;
                            break;
                        default:
                            break;
                    }
                }
                else if (Convert.ToInt16(2) == Convert.ToInt16(cbTipoArt.SelectedValue)) //Es Componente
                {
                    switch (inv.NombreModelo)
                    {
                        case "Lote Fijo":
                            comp.IdModeloInventario = inv.Id;
                            comp.LoteOptimo = txtQ.Text;
                            comp.PuntoPedido = txtPP.Text;
                            comp.StockSeguridad = txtSS.Text;
                            break;
                        case "Intervalo Fijo":
                            comp.StockSeguridad = txtSS.Text;
                            break;
                        default: //Es Fabricación Interna
                            comp.IdModeloInventario = inv.Id;
                            comp.LoteOptimo = txtQ.Text;
                            comp.PuntoPedido = txtPP.Text;
                            comp.StockSeguridad = txtSS.Text;
                            break;
                    } 
                }

                Intermediario.confirmarCambios();
                MessageBox.Show("Cálculos del modelo " + inv.NombreModelo + " guardados.");
                btGuardar.Enabled = false;
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        private void cbTipoArt_SelectedValueChanged(object sender, EventArgs e)
        {
            btGuardar.Enabled = true;
            txtD.Text = "";
            txtCP.Text = "";
            txtTDP.Text = "";
            txtCA.Text = "";

            txtQ.Text = ""; //Lote óptimo
            txtSS.Text = "";
            txtPP.Text = "";

            txtIFQ.Text = "";
            txtIFSS.Text = "";
            txtIFPP.Text = "";

            txtMedidaQ.Text = "";
            txtMedidaSS.Text = "";
            txtMedidaPP.Text = "";

            txtMedidaIFQ.Text = "";
            txtMedidaIFSS.Text = "";
            txtMedidaIFPP.Text = "";

            try
            {                
                if (Convert.ToInt16(1) == Convert.ToInt16(cbTipoArt.SelectedValue)) //Es MP
                {
                    cbArt.DataSource = new IPMateriaPrima().getAll<MateriaPrima>();
                    cbArt.DisplayMember = "nombre";
                    cbArt.ValueMember = "IdMP";
                }
                else if (Convert.ToInt16(2) == Convert.ToInt16(cbTipoArt.SelectedValue))
                {
                    cbArt.DataSource = new IPComponente().getAll<Componente>();
                    cbArt.DisplayMember = "nombre";
                    cbArt.ValueMember = "IdComponente";
                }
                else
                {
                    cbArt.DataSource = new IPProductoProcesoElaboracion().getAll<ProductoProcesoElaboracion>();
                    cbArt.DisplayMember = "nombre";
                    cbArt.ValueMember = "IdPPE";
                }
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            errorProvider1.Dispose();
            double q = 0;
            double loteOptimo = 0;
            double ss = 0;
            double pp = 0;
            double tdp = 0;
            double cp = 0;
            double d = 0;
            double ca = 0;
            double imax = 0;
            double to = 0;
            double no = 0;

            try
            {
                if (txtD.Text != "" && txtCP.Text != "" && txtTDP.Text != "" && txtCA.Text != "")
                {
                    if (Convert.ToInt16(1) == Convert.ToInt16(cbTipoArt.SelectedValue)) //Es MP
                    {
                        mp = new IPMateriaPrima().getByCriterio<MateriaPrima>("", "", cbArt.SelectedValue.ToString()).First();
                        inv = new IPModeloInventario().getCriterioById<ModeloInventario>("", "", Convert.ToInt16(mp.IdModeloInventario)).First();                                                
                    }
                    else if (Convert.ToInt16(2) == Convert.ToInt16(cbTipoArt.SelectedValue))  //Es Componente
                    {
                        comp = new IPComponente().getByCriterio<Componente>("", "", cbArt.SelectedValue.ToString()).First();
                        inv = new IPModeloInventario().getCriterioById<ModeloInventario>("", "", Convert.ToInt16(comp.IdModeloInventario)).First();                                               
                    }
                    else
                    {
                        //ppe = new IPProductoProcesoElaboracion().getPorId(Convert.ToInt16(cbArt.SelectedValue));
                        //inv = new IPModeloInventario().getCriterioById<ModeloInventario>("", "", Convert.ToInt16(ppe.IdModeloInventario)).First();
                    }

                    switch (inv.NombreModelo)
                    {
                        case "Lote Fijo":

                            gbIF.Enabled = false;
                            gbLF.Enabled = true;
                            gbFI.Enabled = false;

                            q = (2 * Convert.ToDouble(txtCP.Text) * Convert.ToDouble(txtD.Text)) / Convert.ToDouble(txtCA.Text);
                            loteOptimo = System.Math.Sqrt(q);

                            tdp = Convert.ToDouble(txtTDP.Text) / 30;
                            ss = System.Math.Sqrt(tdp);

                            pp = (Convert.ToDouble(txtD.Text) / 30 * Convert.ToDouble(txtTDP.Text)) + ss;

                            txtQ.Text = (System.Math.Round(loteOptimo, 2)).ToString(); //Lote óptimo
                            txtSS.Text = (System.Math.Round(ss, 2)).ToString();
                            txtPP.Text = (System.Math.Round(pp, 2)).ToString();
                            
                            break;
                        case "Intervalo Fijo":

                            gbIF.Enabled = true;
                            gbLF.Enabled = false;
                            gbFI.Enabled = false;

                            cp = Convert.ToDouble(txtCP.Text) * 12; //por año
                            tdp = Convert.ToDouble(txtTDP.Text) / 365; //por año
                            d = Convert.ToDouble(txtD.Text) * 12; //por año
                            ca = Convert.ToDouble(txtCA.Text) * 12; //por año

                            q = (2 * cp * d) / ca;
                            loteOptimo = System.Math.Sqrt(q); //por año

                            ss = System.Math.Sqrt(tdp);//por año

                            imax = System.Math.Round(loteOptimo + ss, 0);
                            no = d / loteOptimo;

                            to = (System.Math.Round(365 / no, 0));

                            txtIFQ.Text = (System.Math.Round(loteOptimo, 2)).ToString();
                            txtIFSS.Text = (System.Math.Round(ss, 2)).ToString();
                            txtIFPP.Text = (System.Math.Round(pp, 2)).ToString();
                            
                            break;
                        default: //Es Fabricación Interna
                            gbIF.Enabled = false;
                            gbLF.Enabled = false;
                            gbFI.Enabled = true;

                            break;
                    }

                    if (Convert.ToInt16(1) == Convert.ToInt16(cbTipoArt.SelectedValue) && inv.NombreModelo == "Lote Fijo") //Es MP con Lote Fijo
                    {
                        txtMedidaQ.Text = mp.Medida.NombreMedida;
                        txtMedidaSS.Text = mp.Medida.NombreMedida;
                        txtMedidaPP.Text = mp.Medida.NombreMedida;
                        MessageBox.Show("Cuando el nivel de inventario es de " + txtPP.Text + " " + mp.Medida.NombreMedida + " se debe comprar " + txtQ.Text + " " + mp.Medida.NombreMedida);
                    }
                    else if (Convert.ToInt16(1) == Convert.ToInt16(cbTipoArt.SelectedValue) && inv.NombreModelo == "Intervalo Fijo") //Es MP con Intervalo Fijo
                    {
                        txtMedidaIFQ.Text = mp.Medida.NombreMedida;
                        txtMedidaIFSS.Text = mp.Medida.NombreMedida;
                        txtMedidaIFPP.Text = mp.Medida.NombreMedida;
                        MessageBox.Show("A un intervalo de tiempo fijo de " + to + " dias, debo comprar la cantidad necesaria para tener la existencia máxima de " + imax + " " + mp.Medida.NombreMedida);
                    }
                    else if (Convert.ToInt16(2) == Convert.ToInt16(cbTipoArt.SelectedValue) && inv.NombreModelo == "Lote Fijo") //Es Componente con Lote Fijo
                    {
                        txtMedidaQ.Text = comp.Medida.NombreMedida;
                        txtMedidaSS.Text = comp.Medida.NombreMedida;
                        txtMedidaPP.Text = comp.Medida.NombreMedida;
                        MessageBox.Show("Cuando el nivel de inventario es de " + txtPP.Text + " " + comp.Medida.NombreMedida + " se debe comprar " + txtQ.Text + " " + comp.Medida.NombreMedida);
                    }
                    else if (Convert.ToInt16(2) == Convert.ToInt16(cbTipoArt.SelectedValue) && inv.NombreModelo == "Intervalo Fijo") //Es Componente con Intervalo Fijo
                    {
                        txtMedidaIFQ.Text = comp.Medida.NombreMedida;
                        txtMedidaIFSS.Text = comp.Medida.NombreMedida;
                        txtMedidaIFPP.Text = comp.Medida.NombreMedida;
                        MessageBox.Show("A un intervalo de tiempo fijo de " + to + " dias, debo comprar la cantidad necesaria para tener la existencia máxima de " + imax + " " + comp.Medida.NombreMedida);                            
                    }
                }
                else
                {
                    if (txtD.Text == "")
                    {
                        errorProvider1.SetError(txtD, "Campo obligatorio");
                    }

                    if (txtCP.Text == "")
                    {
                        errorProvider1.SetError(txtCP, "Campo obligatorio");
                    }

                    if (txtTDP.Text == "" )
                    {
                        errorProvider1.SetError(txtTDP, "Campo obligatorio");
                    }

                    if (txtCA.Text == "")
                    {
                        errorProvider1.SetError(txtCA, "Campo obligatorio");
                    }
                }

                //q = (2 * Convert.ToDouble(txtCP.Text) * Convert.ToDouble(txtD.Text)) / Convert.ToDouble(txtCA.Text);
                //loteOptimo = System.Math.Round(System.Math.Sqrt(q),2);

                //tdp = Convert.ToDouble(txtTDP.Text) / 30;
                //ss = System.Math.Sqrt(tdp);

                //pp = (Convert.ToDouble(txtD.Text) / 30 * Convert.ToDouble(txtTDP.Text)) + ss;
            }
            catch (Exception)
            {
                throw;
            }

        }

        private void txtSoloNumeros_KeyPress(object sender, KeyPressEventArgs e) // Solo Números
        {
            if (Char.IsDigit(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = true;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void btCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        
        private void cbArt_SelectedIndexChanged(object sender, EventArgs e)
        {
            txtD.Text = "";
            txtCP.Text = "";
            txtTDP.Text = "";
            txtCA.Text = "";

            txtQ.Text = ""; //Lote óptimo
            txtSS.Text = "";
            txtPP.Text = "";

            txtIFQ.Text = "";
            txtIFSS.Text = "";
            txtIFPP.Text = "";

            txtMedidaQ.Text = "";
            txtMedidaSS.Text = "";
            txtMedidaPP.Text = "";

            txtMedidaIFQ.Text = "";
            txtMedidaIFSS.Text = "";
            txtMedidaIFPP.Text = "";

        }
    }
}
